package com.ebelter.nb.model.nb;

import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.os.Message;
import android.text.TextUtils;
import com.ebelter.btcomlib.models.beans.ScaleUser;
import com.ebelter.btcomlib.models.bluetooth.base.BaseManager;

import com.ebelter.btcomlib.models.bluetooth.bean.ProductStyle;
import com.ebelter.btcomlib.models.bluetooth.interfaces.IConnectStationCallback;

import com.ebelter.btcomlib.models.bluetooth.products.bpm.BpmManager;
import com.ebelter.btcomlib.models.bluetooth.products.bpm.bean.BpmMesureResult;
import com.ebelter.btcomlib.models.bluetooth.products.bpm.interfaces.BPMMeasureCallback;
import com.ebelter.btcomlib.models.bluetooth.products.nb.BondDevices;
import com.ebelter.btcomlib.models.bluetooth.products.scale.ScaleManager;
import com.ebelter.btcomlib.models.bluetooth.products.scale.bean.ScaleMeasureResult;
import com.ebelter.btcomlib.models.bluetooth.products.scale.interfaces.IScaleMeasureCallback;
import com.ebelter.btcomlib.models.https.NetUtils;
import com.ebelter.btcomlib.utils.BaseHandle;
import com.ebelter.btcomlib.utils.NumUtils;
import com.ebelter.btcomlib.utils.TimeUtils;
import com.ebelter.btcomlib.utils.log.LogUtils;
import com.ebelter.nb.interfaces.ISetJiGuanTagAlias;
import com.ebelter.nb.utils.NbUtitls;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.TagAliasCallback;


/**
 * Ehc的设备管理器
 */
public class NbManager extends BaseHandle {


    public static final String TAG = "NbManager";


    private Context mContext;

    /**
     * 当前需要连接的设备
     */
    private ProductStyle curRunProductStyle = ProductStyle.NO;


    private boolean jiguanSetTagAliasSuccessFlag;//设置极光推送是否成功的标志

    //退出释放
    public void exit() {
        stopAutoCheck();
    }


    public NbManager(Context context) {
        super(context);
        init(context);
    }

    //初始化各个产品
    private void init(Context context) {
        this.mContext = context;
        setListeners();
    }

    //设置更种监听器
    private void setListeners() {

    }



    //切换设备
    public void switchingEquipment(ProductStyle productStyle) {



//        if (curRunProductStyle == productStyle) {
//            LogUtils.i(TAG, "当前运行的产品就是切换的产品 无需重新重新切换 curRunProductStyle = "+curRunProductStyle.getBlueName());
//            return;
//        }
        this.curRunProductStyle = productStyle;//记录一下当前需要连接的产品设备


        //startAutoCheck(5000);//开始自动检测

        boolean isBonded = NbUtitls.queryIsBonded(curRunProductStyle);

        if (!isBonded){//未绑定
            LogUtils.i(TAG,"未绑定设备，绑定地址为空 无法连接");
            if (mesuresCalBack!=null){mesuresCalBack.connectError(curRunProductStyle);}

        }





    }


    private static final int WHAT_AUTO_CHECK = 2;


    @Override
    public void handleMsg(Message msg) {
        super.handleMsg(msg);
        if (msg.what == WHAT_AUTO_CHECK) {
            removeMessages(WHAT_AUTO_CHECK);
            sendEmptyMessageDelayed(WHAT_AUTO_CHECK, 10000);
            autoCheck();
        }


    }


    public void disConnectDevices(){
        removeMessages(WHAT_AUTO_CHECK);

    }


    public void startAutoCheck(long delayMillis) {
        removeMessages(WHAT_AUTO_CHECK);
        sendEmptyMessageDelayed(WHAT_AUTO_CHECK, delayMillis);
    }

    public void stopAutoCheck() {
        removeMessages(WHAT_AUTO_CHECK);

    }


    //自动检测机制
    private void autoCheck() {
        LogUtils.i(TAG, "---自动检测机制正在运行--autoCheck（）");

        if (!jiguanSetTagAliasSuccessFlag){
            LogUtils.i(TAG, "---检测到极光推送设置Tag和Alias 失败 准备重新设置");
            initJiGuanLoginInfo();
        }


    }

    //初始化极光登录信息
    public void initJiGuanLoginInfo() {
        setTagAndAlias();
    }

    private ISetJiGuanTagAlias mISetJiGuanTagAlias;

    public void setmISetJiGuanTagAlias(ISetJiGuanTagAlias mISetJiGuanTagAlias) {
        this.mISetJiGuanTagAlias = mISetJiGuanTagAlias;
    }

    /**
     * 设置标签与别名
     */
    private void setTagAndAlias() {
        /*
         *这里设置了别名，在这里获取的用户登录的信息
         *并且此时已经获取了用户的userId,然后就可以用用户的userId来设置别名了
         **/
        //false状态为未设置标签与别名成功
        //if (UserUtils.getTagAlias(getHoldingActivity()) == false) {
        Set<String> tags = new HashSet<>();
        //这里可以设置你要推送的人，一般是用户uid 不为空在设置进去 可同时添加多个
        String user = NbUtitls.getLoginUserId();
        BondDevices bpmD = NbUtitls.getBondBpmDevice();//获取绑定的血压计
        BondDevices scaleD = NbUtitls.getBondScaleDevice();//获取绑定的体脂秤

        if (bpmD!=null){
            tags.add(bpmD.device_id);//设置tag
            LogUtils.i(TAG,"---增加了血压计imei---"+bpmD.device_id);
        }
        if (scaleD!=null){
            tags.add(scaleD.device_id);//设置tag
            LogUtils.i(TAG,"---增加了体脂秤imei---"+scaleD.device_id);
        }
        tags.add(user);//设置tag
        LogUtils.i(TAG,"---增加了alias---"+user);

        //上下文、别名【Sting行】、标签【Set型】、回调
        JPushInterface.setAliasAndTags(mContext, "szebelter", tags, mAliasCallback);
    }

    /**
     * TagAliasCallback类是JPush开发包jar中的类，用于
     * 设置别名和标签的回调接口，成功与否都会回调该方法
     * 同时给定回调的代码。如果code=0,说明别名设置成功。
     * 6001   无效的设置，tag/alias 不应参数都为 null
     * 6002   设置超时    建议重试
     * 6003   alias 字符串不合法    有效的别名、标签组成：字母（区分大小写）、数字、下划线、汉字。
     * 6004   alias超长。最多 40个字节    中文 UTF-8 是 3 个字节
     * 6005   某一个 tag 字符串不合法  有效的别名、标签组成：字母（区分大小写）、数字、下划线、汉字。
     * 6006   某一个 tag 超长。一个 tag 最多 40个字节  中文 UTF-8 是 3 个字节
     * 6007   tags 数量超出限制。最多 100个 这是一台设备的限制。一个应用全局的标签数量无限制。
     * 6008   tag/alias 超出总长度限制。总长度最多 1K 字节
     * 6011   10s内设置tag或alias大于3次 短时间内操作过于频繁
     **/
    private final TagAliasCallback mAliasCallback = new TagAliasCallback() {
        @Override
        public void gotResult(int code, String alias, Set<String> tags) {
            LogUtils.i(TAG, "code=" + code + "--alias = " + alias);

            Iterator it=tags.iterator();
            while (it.hasNext()){
                String tag = (String) it.next();
                LogUtils.i(TAG, "tag = "+tag);
            }


            String logs;
            switch (code) {
                case 0:
                    //这里可以往 SharePreference 里写一个成功设置的状态。成功设置一次后，以后不必再次设置了。
                    //UserUtils.saveTagAlias(getHoldingActivity(), true);
                    logs = "极光推送别名设置成功Set tag and alias success";
                    // ToastUtil.show("code="+code+"--alias = "+alias+"--极光推送别名设置成功");
                    jiguanSetTagAliasSuccessFlag = true;
                    break;
                case 6002:
                    //极低的可能设置失败 我设置过几百回 出现3次失败 不放心的话可以失败后继续调用上面那个方面 重连3次即可 记得return 不要进入死循环了...
                    logs = "极光推送别名设置失败，60秒后重试Failed to set alias and tags due to timeout. Try again after 60s";
                    jiguanSetTagAliasSuccessFlag = false;
                    break;
                default:
                    logs = "极光推送设置失败，Failed with errorCode = " + code;
                    // ToastUtil.show("code="+code+"--alias = "+alias+"--极光推送别名设置失败");
                    jiguanSetTagAliasSuccessFlag = false;
                    break;
            }
            LogUtils.i(TAG, logs);
            if (mISetJiGuanTagAlias!=null){
                if (jiguanSetTagAliasSuccessFlag){
                    mISetJiGuanTagAlias.success();
                }else {
                    mISetJiGuanTagAlias.failure();
                }
            }
        }
    };








        private AMesuresCalBack mesuresCalBack;
        public void setMesuresCalBack(AMesuresCalBack mesuresCalBack) {
            this.mesuresCalBack = mesuresCalBack;
        }

    }
